﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using DTTB.MV2.QUANLYNHANSUTIENLUONG.Models.LinQ.ChamCong;
using DTTB.MV2.QUANLYNHANSUTIENLUONG.Models.FormBean.NhanVienModel;
using System.Web.Mvc;
using DTTB.MV2.QUANLYNHANSUTIENLUONG.Models.FormBean.ChamCongModel;

namespace DTTB.MV2.QUANLYNHANSUTIENLUONG.BussinessDelegate.NhanVienDelegate
{
    public class ThoiViecDelegate
    {
        #region Private Member

        CommonDelegate.CommonDelegate commonDelegate = new CommonDelegate.CommonDelegate();
        ChamCongDelegate.ChamCongServiceDelegate chamCongServiceDelegate = new ChamCongDelegate.ChamCongServiceDelegate();
        DBChamCongDataContext dBChamCong = new DBChamCongDataContext();
        readonly int _currentUserId = Convert.ToInt32(HttpContext.Current.Session["USERID"].ToString());

        #endregion

        #region Get

        #region Bảng tb_NhanVien

        public IQueryable<hs_NhanVien> QueryGetAllNhanVien()
        {
            return dBChamCong.hs_NhanViens.Where(p => p.IsDelete == false || p.IsDelete == null);
        }

        public hs_NhanVien GetNhanVienById(int? idNhanVien)
        {
            return dBChamCong.hs_NhanViens.SingleOrDefault(p => p.Id == idNhanVien);
        }

        #endregion

        #endregion

        #region Set

        public bool SaveThoiViec(ThoiViecForm form)
        {
            //1. Lưu lại thông tin Nhân Viên
            //2. Cập nhật lại Dữ liệu cho Bảng CC_ChamCongNgayNhanVien
            //      Từ Ngày Bắt Đầu Nghỉ cho đến cuối tháng sẽ tự động lưu vào Ký Hiệu NVCLV (Những Ngày tiếp theo của tháng sẽ là Nghỉ Việc)

            using (var transaction = new System.Transactions.TransactionScope(System.Transactions.TransactionScopeOption.RequiresNew))
            {
                try
                {
                    hs_NhanVien objNhanVien = GetNhanVienById(form.IdNhanVien);

                    objNhanVien.SoGioDuocHuongThoiViec = Convert.ToInt32(form.SoGioDuocHuongThoiViec);
                    objNhanVien.NgayNghiViec = commonDelegate.ConvertStringToDateTime(form.NgayNghiViec);
                    objNhanVien.LyDoThoiViec = !string.IsNullOrEmpty(form.LyDoThoiViec) ? form.LyDoThoiViec.Trim() : string.Empty;

                    objNhanVien.UpdateBy = _currentUserId;
                    objNhanVien.UpdateDate = DateTime.Now;

                    chamCongServiceDelegate.LuuChamCongThoiViec(form.IdNhanVien, objNhanVien.NgayNghiViec.Value);

                    dBChamCong.SubmitChanges();
                    transaction.Complete();
                    transaction.Dispose();
                    return true;
                }
                catch (Exception)
                {
                    return false;
                }
            }
        }

        #endregion

        #region Build

        public ThoiViecForm BuildThoiViecNhanVien(int idNhanVien)
        {
            var form = new ThoiViecForm();
            var objNhanVien = GetNhanVienById(idNhanVien);
            if (objNhanVien != null)
            {
                //Build Thông Tin Cá Nhân
                form.IdNhanVien = objNhanVien.Id;
                form.SoThe = objNhanVien.SoThe;
                form.HoTen = chamCongServiceDelegate.GhepHoVaTen(objNhanVien.Ho, objNhanVien.Ten);
                form.SoGioDuocHuongThoiViec = objNhanVien.SoGioDuocHuongThoiViec.ToString("#0");
                form.NgayNghiViec = objNhanVien.NgayNghiViec != null ? commonDelegate.ConvertDateTimeToString(objNhanVien.NgayNghiViec) : commonDelegate.ConvertDateTimeToString(DateTime.Now);
                form.LyDoThoiViec = objNhanVien.LyDoThoiViec;

                //Tổng hợp lại Chấm Công trước  ******************
                chamCongServiceDelegate.TinhTongHopVaLuuLaiDuLieuChamCongByThangNamVaIdNhanVien(DateTime.Today.Month, DateTime.Today.Year, idNhanVien);

                var ccChamCongNgayNhanVien = chamCongServiceDelegate.GetChamCongNgayNhanVienByThangNamVaIdNhanVien(DateTime.Today.Month, DateTime.Today.Year, idNhanVien);
                var ccnhanVienForm = new ChamCongNgayNhanVienForm();

                ////Build Dữ liệu chấm công của nhân viên trong một tháng
                //ccnhanVienForm.ListChamCongNgay = chamCongServiceDelegate.GetChamCongNgayVaTangCaByThangNamVaIdNhanVien(DateTime.Today.Month, DateTime.Today.Year, idNhanVien);
                ccnhanVienForm.TongThuViec = Convert.ToByte(ccChamCongNgayNhanVien.TongThuViec);
                ccnhanVienForm.TongNghiKhamThai = Convert.ToByte(ccChamCongNgayNhanVien.TongNghiKhamThai);
                ccnhanVienForm.TongNghiCoPhep = Convert.ToByte(ccChamCongNgayNhanVien.TongNghiCoPhep);
                ccnhanVienForm.TongNghiKhongPhep = Convert.ToByte(ccChamCongNgayNhanVien.TongNghiKhongPhep);
                ccnhanVienForm.TongNghiConBenh = Convert.ToByte(ccChamCongNgayNhanVien.TongNghiConBenh);
                ccnhanVienForm.TongNghiBenh = Convert.ToByte(ccChamCongNgayNhanVien.TongNghiBenh);
                ccnhanVienForm.TongNghiThaiSan = Convert.ToByte(ccChamCongNgayNhanVien.TongNghiThaiSan);
                ccnhanVienForm.TongNghiThaiSan = Convert.ToByte(ccChamCongNgayNhanVien.TongNghiThaiSan);
                ccnhanVienForm.TongNghiPhepNam = ccChamCongNgayNhanVien.TongNghiPhepNam;
                ccnhanVienForm.TongNghiCheDo = Convert.ToByte(ccChamCongNgayNhanVien.TongNghiCheDo);
                ccnhanVienForm.TongNghiLe = Convert.ToByte(ccChamCongNgayNhanVien.TongNghiLe);
                ccnhanVienForm.TongNghiKhongCoViec = Convert.ToByte(ccChamCongNgayNhanVien.TongNghiKhongCoViec);
                ccnhanVienForm.TongSoGioTangCa = Convert.ToByte(ccChamCongNgayNhanVien.TongSoGioTangCa);
                ccnhanVienForm.TongVangMat = Convert.ToByte(ccChamCongNgayNhanVien.TongVangMat);
                ccnhanVienForm.TongSoNgayLamViec = ccChamCongNgayNhanVien.TongSoNgayLamViec;
                ccnhanVienForm.TongCaDem = ccChamCongNgayNhanVien.TongCaDem;
                ccnhanVienForm.GhiChu = ccChamCongNgayNhanVien.GhiChu;

                form.ChamCongNgayNhanVien = ccnhanVienForm;
                form.LichChamCong = BuildLichChamCongThang(DateTime.Today.Month, DateTime.Today.Year, ccChamCongNgayNhanVien);
            }
            return form;
        }

        public IList<ChamCongTuanForm> BuildLichChamCongThang(int thang, int nam, CC_ChamCongNgayNhanVien objChamCongNgayNhanVien)
        {
            var lstChamCongTuan = new List<ChamCongTuanForm>();
            DateTime ngayDauThang = commonDelegate.ConvertToDateTime(1, thang, nam).Value;

            ChamCongTuanForm tuanDauTien = new ChamCongTuanForm();
            ChamCongTuanForm tuanThuHai = new ChamCongTuanForm();
            ChamCongTuanForm tuanThuBa = new ChamCongTuanForm();
            ChamCongTuanForm tuanThuTu = new ChamCongTuanForm();
            ChamCongTuanForm tuanThuNam = new ChamCongTuanForm();

            tuanDauTien.ThuTrongTuan = BuildLichTrongTuan(ngayDauThang);
            tuanThuHai.ThuTrongTuan = BuildLichTrongTuan(tuanDauTien.ThuTrongTuan.Last().AddDays(1));
            tuanThuBa.ThuTrongTuan = BuildLichTrongTuan(tuanThuHai.ThuTrongTuan.Last().AddDays(1));
            tuanThuTu.ThuTrongTuan = BuildLichTrongTuan(tuanThuBa.ThuTrongTuan.Last().AddDays(1));
            tuanThuNam.ThuTrongTuan = BuildLichTrongTuan(tuanThuTu.ThuTrongTuan.Last().AddDays(1));

            foreach (var item in tuanDauTien.ThuTrongTuan)
            {
                if (item.Month == thang && item.Year == nam)
                    tuanDauTien.ChamCongNgayTrongTuan.Add(chamCongServiceDelegate.GetChamCongNgayVaTangCaByChamCongNgayVaNgay(objChamCongNgayNhanVien, item.Day));
                else
                {
                    tuanDauTien.ChamCongNgayTrongTuan.Add(new NgayTrongThang());
                }
                tuanDauTien.ThuTrongTuanString.Add(item.ToString("dd/MM/yyyy"));
            }
            foreach (var item in tuanThuHai.ThuTrongTuan)
            {
                tuanThuHai.ChamCongNgayTrongTuan.Add(chamCongServiceDelegate.GetChamCongNgayVaTangCaByChamCongNgayVaNgay(objChamCongNgayNhanVien, item.Day));
                tuanThuHai.ThuTrongTuanString.Add(item.ToString("dd/MM/yyyy"));
            }
            foreach (var item in tuanThuBa.ThuTrongTuan)
            {
                tuanThuBa.ChamCongNgayTrongTuan.Add(chamCongServiceDelegate.GetChamCongNgayVaTangCaByChamCongNgayVaNgay(objChamCongNgayNhanVien, item.Day));
                tuanThuBa.ThuTrongTuanString.Add(item.ToString("dd/MM/yyyy"));
            }
            foreach (var item in tuanThuTu.ThuTrongTuan)
            {
                tuanThuTu.ChamCongNgayTrongTuan.Add(chamCongServiceDelegate.GetChamCongNgayVaTangCaByChamCongNgayVaNgay(objChamCongNgayNhanVien, item.Day));
                tuanThuTu.ThuTrongTuanString.Add(item.ToString("dd/MM/yyyy"));
            }
            foreach (var item in tuanThuNam.ThuTrongTuan)
            {
                if (item.Month == thang && item.Year == nam)
                    tuanThuNam.ChamCongNgayTrongTuan.Add(chamCongServiceDelegate.GetChamCongNgayVaTangCaByChamCongNgayVaNgay(objChamCongNgayNhanVien, item.Day));
                else
                {
                    tuanThuNam.ChamCongNgayTrongTuan.Add(new NgayTrongThang());
                }
                tuanThuNam.ThuTrongTuanString.Add(item.ToString("dd/MM/yyyy"));
            }

            lstChamCongTuan.Add(tuanDauTien);
            lstChamCongTuan.Add(tuanThuHai);
            lstChamCongTuan.Add(tuanThuBa);
            lstChamCongTuan.Add(tuanThuTu);
            lstChamCongTuan.Add(tuanThuNam);

            return lstChamCongTuan;
        }

        /// <summary>
        /// Build Lịch trong tuần (Bắt đầu từ thứ 2 -> Chủ Nhật)
        /// </summary>
        /// <param name="ngayTrongTuan"></param>
        /// <returns></returns>
        public IList<DateTime> BuildLichTrongTuan(DateTime ngayTrongTuan)
        {
            IList<DateTime> result = new List<DateTime>();

            DateTime ngayDauTuan = ngayTrongTuan;

            while (ngayDauTuan.DayOfWeek != DayOfWeek.Monday)
            {
                ngayDauTuan = ngayDauTuan.AddDays(-1);
            }

            for (int indexNgay = 0; indexNgay < 7; indexNgay++)
            {
                result.Add(ngayDauTuan.AddDays(indexNgay));
            }

            return result;
        }

        #endregion
    }

    public class ChamCongTuanForm
    {
        public ChamCongTuanForm()
        {
            this.ThuTrongTuan = new List<DateTime>();
            this.ThuTrongTuanString = new List<string>();
            this.ChamCongNgayTrongTuan = new List<NgayTrongThang>();
        }
        /// <summary>
        /// Các thứ trong tuần
        /// </summary>
        public IList<DateTime> ThuTrongTuan { get; set; }
        /// <summary>
        /// Các thứ trong tuần
        /// </summary>
        public IList<string> ThuTrongTuanString { get; set; }
        /// <summary>
        /// Chấm Công Các ngày trong tuần
        /// </summary>
        public IList<NgayTrongThang> ChamCongNgayTrongTuan { get; set; }
    }
}